package list;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * Vector基本不再使用
 * <p>
 * ArrayList底层使用数组结构，查找和添加（尾部添加）操作效率高，时间复杂度为O(1)
 * --删除和插入操作效率低，时间复杂度为O(n)
 * <p>
 * LinkedList底层使用双向链表结构，删除和插入操作效率高，时间复杂度为O(1)
 * --查找和尾部添加操作效率第，时间复杂度为O(n)
 * <p>
 * 在选择了ArrayList的前提下，
 * --new ArrayList()：底层创建长度为10的数组。
 * --new ArrayList(uint capacity):底层创建指定capacity长度的数组。
 */
public class ListTest {
    /**
     * ArrayList
     */
    @Test
    public void testJDK7() {
        //  如下代码的执行：底层会初始化数组，数组的长度为10.
        // Object[] elementData = new Object[10];
        List<Integer> list = new ArrayList<>();
        list.add(1);
        // ...
        // 当要添加第11个元素的时候，底层的elementData数字已满，则需要扩容。
        // 默认扩容为原来长度的1.5倍。并将原有数组中的元素复制到新的数组中。
        list.add(11);
    }

    @Test
    public void testJDK8() {
        //  如下代码的执行：底层会初始化数组，数组的长度为10.
        // Object[] elementData = new Object[]{};
        List<Integer> list = new ArrayList<>();
        /*
         首次添加元素，会初始化数组
         elementData = new Object[10];
         elementData[0] = 1;
        */
        list.add(1);
        // ...
        // 当要添加第11个元素的时候，底层的elementData数字已满，则需要扩容。
        // 默认扩容为原来长度的1.5倍。并将原有数组中的元素复制到新的数组中。
        list.add(11);
    }
}
